package design.pattern.singleton.lazy;

// 这种形式兼顾饿汉式的内存浪费，也兼顾synchronized性能问题
// 完美地屏蔽了这两个缺点
// 史上最牛B的单例模式的实现方式

/**
 * @description: 懒汉式单例-静态内部类  （反射破坏单例）
 * @author: liuzhangcheng
 **/
public class ReflexLazyInnerClassSingleton {
    // 默认使用LazyInnerClassSingleton的时候，会先初始化内部类，
    // 如果没使用的话，内部类是不加载的

    private ReflexLazyInnerClassSingleton() {
        // 解决反射带来出现多个实例的问题
        if (Holder.LAZY != null) {
            throw new RuntimeException("不允许创建多个实例");
        }
    }

    // 每一个关键字都不是多余的
    // static 是为了使单例的空间共享
    // 保证这个方法不会被重写，重载
    public static final ReflexLazyInnerClassSingleton getInstance() {
        //在返回结果以前，一定会先加载内部类
        return Holder.LAZY;
    }

    // 内部类默认不加载
    private static class Holder {
        private static final ReflexLazyInnerClassSingleton LAZY = new ReflexLazyInnerClassSingleton();
    }
}
